void main() {
  //1、初始化列表，任何类型构造方法执行之前，可以初始化实例变量
  //  1:不同的初始化变量之间用逗号分隔开
  //  2:不能同时通过参数初始化变量和初始化列表初始化变量
  //  3:初始化列表允许的用来给变量赋值、调用assert来校验输入、调用super来初始化父类，
  //    但是不允许调用this的其他方法，因为这个时候还没初始化该类的实例
  SuperClass1 superClass1 = SuperClass1('jack', 20);
  print(superClass1);
//  SuperClass2 superClass2 = SuperClass2('lucy', 21);//报错，assert限制age
  //2、子类在初始化时调用顺序如下
  //  1:初始化列表
  //  2:调用父类构造函数
  //  3:子类构造函数
  //  4:子类无参构造函数默认第一行调用父类无参构造函数
  //  5:如果父类中没有默认的构造函数，你必须手动在在子类的构造函数体之前通过 : 指定调用父类构造函数
//  Child child = Child.create('lily', 20, 'nv');
  Child child = Child('lily', 20, 'nv');
  print(child);
}

class Child extends Parent {
  String sex;

  Child(String name, int age, this.sex) : super(name, age) {
    this.sex = sex;
  }

  Child.create(String name, int age, this.sex) : super.create(name, age);

  @override
  String toString() {
    // TODO: implement toString
    return 'name is $name, age is $age, sex is $sex';
  }
}

class Parent {
  String name;
  int age;

  Parent(String name, int age) {
    this.name = name;
    this.age = age;
  }

  Parent.create(this.name, this.age);
}

class SuperClass2 {
  String name;
  int age;
  String sex;

  SuperClass2(String name, int age)
      : name = name,
        assert(age > 30),
        age = age;

  @override
  String toString() {
    // TODO: implement toString
    return 'name is $name, age is $age, sex is $sex';
  }
}

class SuperClass1 {
  String name;
  int age;
  String sex;

  SuperClass1(String name, int age)
      : this.name = name,
        age = age,
        sex = 'nv';

//  SuperClass(this.name, age)
//      : this.name = name,
//        age = age,
//        sex = 'nv';

  @override
  String toString() {
    // TODO: implement toString
    return 'name is $name, age is $age, sex is $sex';
  }
}
